mod t1501_partial_move;
mod t1502_borrow;
mod t1503_borrow_mut;
mod t1504_borrow_alias;

#[allow(unused)]
// 所有者概念只针对于存于堆上的数据，对于存于栈上的数据没有所有者的概念
fn main() {
    // a 和 b 是基础数据类型，存于栈上，赋值会自动拷贝，没有所有者的概念
    let a = 88;
    let b = a;
    println!("a:{}, b:{}", a, b);

    let book_list = vec!["Rust入门指南", "Rust深入浅出", "Rust权威指南"];
    let book_list2 = book_list;
    // 上面赋值语句，向量的所有者已发生改变，变为 book_list2，book_list 不再是向量的所有者，无法再访问
    // show(book_list);
    show(book_list2);

    let mut s = String::from("hello");
    change(&mut s);
    change2(&mut s);
    println!("{}",s);

    let mut vv = vec!["book01".to_string(), "book02".to_string(), "book03".to_string()];
    for mut ss in &mut vv {
         ss.push('!');
        println!("{}", ss);
    }
    //错误提示，vv前面被移动了，现在无法借用
    //上面循环使用可变引用，不是 move，那下面打印的代码就可以执行
    println!("{:?}", vv);

    // 因为整数具有Copy特性，所以整数型数组也具有Copy特性，这样赋值时可以直接拷贝
    let a = [1, 2, 3, 4, 5];
    let b = a;
    println!("a:{:?}, b:{:?}", a, b);

}

fn change(some_string: &mut String) {
    some_string.push_str(", world");
}
fn change2(some_string: &mut String) {
    some_string.push_str(", test");
}
fn show(v: Vec<&str>) {
    println!("v {:?}", v)
}